Date : 9 juin 1991
Protection : DISQUETTE CLEF
Programme : DICK TRACY
Outils : SOFT-ICE, SOURCER, QUAID, MASM, EXE2BIN.
Fichier : n�ant
Temps pass� : 12 Heures
Soci�t� : TITUS
Divers : Cr�ation du fichier FRED.COM
Origine : MICHOU
Num�ro : 086
Une protection disquette 3.5" 720k en piste 4F ( 80 ).
L'auteur de la protection a beaucoup d'humour puisque dans tout
les secteurs de la piste 79 on peut lire des choses interessantes,
voir ci-dessous. Et de toute �vidence la protection se trouve dans
la piste 79 secteur 247 !!!
Cylinder 79, Side 0, Sector 247:
0000 A001prot by Eric CAEN (c) Titus 1990...Hackers, I hate you !!!!N
0040 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
0080 NNNNNNNNNNNNNNNNNNNNNNNNN_ 000?
00c0 (hh @ @ S
0100 (hh~TYX] \ [X \ H XZY\ H \ H [[Y[ HH@
0140
Cylinder 79, Side 0, Sector 10:
0000 Sector number J Hackers are women !!!
0040
0080
00c0
0100
0140
Je commence � lan�er QUAID pour voir sur quelle interruption je peux
me placer avec SOFT-ICE. Le message WRONG DISK est affich� � l'aide de
l'INT 21 fonction 09. Je place donc SOFT-ICE sur cette interruption et
d�s qu'il s'affiche je dessassemble en arri�re pour voir ce qui le fait
passer par l�. Ceci n'est pas toujours possible. Et effectivement le
programme va tester 3 fois la disquette par un CALL puis fait un test
pour finalement afficher le message et se bloquer. En forcant le saut
apr�s l'un des CALL le soft fonctionne. C'est presque trop beau.
Et effectivement c'est trop beau car d'une part cette chaine est
comme de bien entendu introuvable et d'autre part tout les fichiers
except� le LOADER "loaddick.com" sont crypt�s.
La routine qui teste la protection de la disquette est la suivante:
E83100 CALL 00B1 --> PREMIER TEST
7325 JAE 00A7 --> SI OK ON SAUTE APRES L'INT 21
E82C00 CALL 00B1 --> SECOND TEST
7320 JAE 00A7 --> SI OK SAUT APRES L'INT 21
. .
. INT 21 AH=09 ---> AFFICHAGE MESSAGE D'ERREUR
. INT 21 AH=4C ---> TERMINATE PROCESS
Il suffit de transformer un des 73 en EB ( JMP ).
En essayant de savoir d'ou vient mon 73 je remonte 3 niveaux en arri�re
pour me retrouver dans le programme de LOADDICK.COM
Ce fichier LOADDICK.COM est un d�compacteur qui charge soit EGA.SQZ ou
bien CGA.SQZ. Il va de soit que la moindre modification dans EGA.SQZ
fait tout planter. J'ai bien sur trouv� la chaine dans laquelle se
trouve mon 73, celui-ci modifi� en EB plante le programme.
Chaine dans EGA.SQZ: 73806E807D804F point� par DS:1DA.
La modification faite au moment ou le programme LOADDICK a fini de
charger EGA.SQZ et passe la main � celui-ci ne fonctionne pas plus.
Le seul moment ou cel� fonctionne c'est au retour de l'INT 40 avant
que le soft ne teste le FLAG CARRY. Autant dire qu'il n'y a pratiquement
plus de solution. Il en reste pourtant une ( et il y en a toujours une
il suffit simplement de la trouver et de vouloir y consacrer suffisament
de temps pour la mettre au point, c'est d'ailleurs sur ce dernier point
que compte les auteurs de protections en tout genre puisque la volont�
de craquer un logiciel est inversement proportionnelle au temps qu'on
met pour trouver la parade.
Donc je pense que le d�tournement de l'INT 40 ou l'INT 21 pour faire
mon patch ne devrait pas poser trop de probl�me, de plus c'est un
exercice de haute voltige car il va falloir jouer avec le pointeur de
pile. ( c'est ce que je d�teste le plus...)
Je d�cide de laisser de cot� l'INT 21 car cette derni�re est appel�e
un nombre incalculables de fois par le programme pour jeter mon d�volu
sur l'INT 40.
Le sch�ma directeur en est le suivant:
Faire un petit morceau de code qui redirige l'INT 40 sur une routine
personnelle qui effectuera le patch puis executera l'INT 40 normalement.
Ce petit morceau de code devra �tre lancer avant le jeu lui-m�me et
rester r�sident. Autrement dit il faut �crire un petit programme TSR.
Le listing ci-dessous est suffisement comment� sans n�cessiter
d'explications compl�mentaires.
code segment
org 100h
assume cs:code
start: jmp installe
cr equ 0dh
lf equ 0ah
adr_ip equ 0071h
patch equ 0EBh ; jmp � mettre � la place de JAE ( 73 )
_off equ 2ah ; SP + 2a = 0FBA ---> adr de CS:0071
initprog db cr,lf
db ' Si Disque Dur OK sinon utiliser la disquette copi�e '
db 'avec COPY BOARD',cr,lf,'$'
instok db cr,lf,' See you soon FREDDY_SOFT',cr,lf,'$'
int40 label dword ;sauvegarde des adresses SEG:OFF de l'INT40
i40off db 0,0 ;d'origine.
i40seg db 0,0
flag db 0,0 ;Si le patch est fait on saute la routine.
tsrint40 proc far ; point d'entr� de mon INT40 modifi�
sti
nop
push ds ; on sauve tout les registres.
push es
push di
push si
push dx
push cx
push bx
push ax
cmp byte ptr [flag],1h ; On regarde si c'est fait...
jz suite ; Si c'est d�j� fait on continu...
mov ax,sp ; SP est envoy� dans AX.
increm: pop ds ; On commence par la position actuelle de SP.
cmp byte ptr ds:[adr_ip],73h ; Et on compare l'octet en
; DS:[adr_ip] � 73. ( CS:IP )
jnz increm ; On teste la position SP+2 ( puisque l'on a POP� )
mov byte ptr ds:[adr_ip],patch ; Si �gale � 73 on y met EB.
mov byte ptr [flag],1h ; On met le drapeau.
mov sp,ax ; On remet le pointeur d'origine.
suite: pop ax ; Et on restaure les registres...
pop bx
pop cx
pop dx
pop si
pop di
pop es
pop ds
pushf
cli
call int40 ; appel de l'INT40 officielle.
ret 2 ; et on revient
tsrint40 endp
eor:
; ROUTINE D'INSTALLATION EN RESIDENT DU CODE CI-DESSUS.
installe: mov ax,cs ; CS --> DS
mov ds,ax
mov dx,offset initprog ; message de debut
mov ah,09h
int 21h
mov ax,3540h ; on detourne l'int 40h
int 21h ; sous-fonction 35
mov word ptr [i40off],bx
mov i40seg,es
mov ax,2540h ; et on met l'ad. du resident
mov dx,offset tsrint40 ; sous-fonction 25
int 21h
mov dx,offset instok ; message de fin
mov ah,09h
int 21h
mov dx,eor-start+100h+15 ; A voir....
mov cl,4
shr dx,cl
mov al,0
mov ah,31h ; sortie et reservation
int 21h ; de la memoire
code ends
end start
Voil� et cel� fonctionne parfaitement ( test� sur un 386 et deux 286 )
du moment que le jeu est install� sur disque dur, par contre sur
disquette cel� se plante mais ce ne doit pas �tre grand chose.
( revoir la recherche de l'octet, ou bien changer d'IT )
FREDDY
|